<?php
namespace app\common\model;

use think\Db;

/**
 * ConnectionModel类
 * @author 贺强
 * @time   2019-07-25 13:01:04
 */
class ConnectionModel extends \think\Model
{
    public $connect = null;
    public $table   = null;

    /**
     * 切换数据库连接
     * @author 贺强
     * @time   2019-07-31 13:47:24
     * @param  integer $connect 要连接的数据库，2-dy_cpa
     * @param  string  $table   要操作的数据库表名
     */
    public function __construct($connect = null, $table = null)
    {
        if ($connect === 2) {
            $connect = 'database.dy_cpa';
        } elseif ($connect === 3) {
            $connect = 'database.distribution';
        } elseif ($connect === 4) {
            $connect = 'database.leduo';
        } elseif ($connect === 5) {
            $connect = 'database.sanguo';
        }
        $this->connect = config($connect);
        $this->table   = $table;
    }

    /**
     * 添加一条数据
     * @author 贺强
     * @time   2019-07-31 13:51:56
     * @param  array   $data     要添加的数据
     * @param  boolean $fetchSql 是否打印SQL
     */
    public function add($data, $fetchSql = false)
    {
        if (empty($data['ctime'])) {
            $data['ctime'] = time();
        }
        $id = Db::connect($this->connect)
            ->table($this->table)
            ->fetchSql($fetchSql)
            ->insertGetId($data);
        if ($id === 0) {
            $id = true;
        }
        return $id;
    }

    /**
     * 添加多条数据
     * @author 贺强
     * @time   2019-07-31 09:41:16
     * @param  array   $data     要添加的数据
     * @param  boolean $fetchSql 是否打印SQL语句
     */
    public function addArr($data, $fetchSql = false)
    {
        foreach ($data as &$item) {
            if (empty($item['ctime'])) {
                $item['ctime'] = time();
            }
        }
        $num = Db::connect($this->connect)
            ->table($this->table)
            ->fetchSql($fetchSql)
            ->insertAll($data);
        return $num;
    }

    /**
     * 根据条件删除数据
     * @author 贺强
     * @time   2019-05-17 11:18:26
     * @param  array|string  $where    删除条件，[['id','>', 3],……]或SQL字符串
     * @param  boolean       $fetchSql 是否打印SQL语句
     * @return integer                 返回影响行数
     */
    public function delByWhere($where = null, $fetchSql = false)
    {
        $num = Db::connect($this->connect)
            ->table($this->table)
            ->where($where)
            ->fetchSql($fetchSql)
            ->delete();
        return $num;
    }

    /**
     * 根据条件修改一条数据
     * @author 贺强
     * @time   2019-07-31 14:04:52
     * @param  array   $data     要修改的数据
     * @param  string  $where    条件
     * @param  boolean $fetchSql 是否打印SQL
     * @return integer           返回影响的行数
     */
    public function modify($data, $where = '1=1', $fetchSql = false)
    {
        if (empty($data['mtime'])) {
            $data['mtime'] = time();
        }
        $num = Db::connect($this->connect)
            ->table($this->table)
            ->where($where)
            ->fetchSql($fetchSql)
            ->update($data);
        return $num;
    }

    /**
     * 根据条件修改某字段的值
     * @author 贺强
     * @time   2019-07-31 14:07:04
     * @param  string  $field    某字段
     * @param  string  $value    值
     * @param  string  $where    条件
     * @param  boolean $fetchSql 是否打印SQL
     * @return integer           返回受影响的行数
     */
    public function modifyField($field, $value, $where = '1=1', $fetchSql = false)
    {
        $num = Db::connect($this->connect)
            ->table($this->table)
            ->where($where)
            ->fetchSql($fetchSql)
            ->setField($field, $value);
        return $num;
    }

    /**
     * 修改数据集合
     * @author 贺强
     * @time   2020-05-25 14:17:01
     * @param  array   $data 要修改的数据
     * @return integer       返回影响的行数
     */
    public function saveAll2($data = [], $fetchSql = false)
    {
        try {
            $num = 0;
            foreach ($data as $item) {
                if (empty($item['id'])) {
                    continue;
                }
                $num += Db::connect($this->connect)
                    ->table($this->table)
                    ->where(['id' => $item['id']])
                    ->fetchSql($fetchSql)
                    ->update($item);
            }
            return $num;
        } catch (\Exception $e) {
            return false;
        }
    }

    /**
     * 根据条件自增某字段的值
     * @author 贺强
     * @time   2019-07-31 14:08:42
     * @param  string  $field    某字段
     * @param  array   $where    条件
     * @param  integer $value    自增量
     * @param  integer $delay    延迟更新的秒数
     * @param  boolean $fetchSql 是否打印SQL
     * @return integer           返回受影响的行数
     */
    public function increment($field, $where = [], $value = 1, $delay = 0, $fetchSql = false)
    {
        $num = Db::connect($this->connect)
            ->table($this->table)
            ->where($where)
            ->fetchSql($fetchSql)
            ->setInc($field, $value, $delay);
        return $num;
    }

    /**
     * 根据条件查询一条数据
     * @author 贺强
     * @time   2019-07-31 13:58:59
     * @param  string  $where    条件
     * @param  boolean $field    要查询的字段
     * @param  string  $order    排序字段
     * @param  boolean $lock     是否加锁
     * @param  boolean $fetchSql 是否打印SQL
     * @return array             返回查询结果
     */
    public function getModel($where = null, $field = true, $order = '', $lock = false, $fetchSql = false)
    {
        $model = Db::connect($this->connect)
            ->table($this->table)
            ->field($field)
            ->order($order)
            ->where($where)
            ->lock($lock)
            ->fetchSql($fetchSql)
            ->find();
        return $model;
    }

    /**
     * 根据条件获取数量
     * @author 贺强
     * @time   2019-07-31 17:50:07
     * @param  string  $where    条件
     * @param  string  $field    要统计数量的字段
     * @param  string  $group    对结果进行分组
     * @param  boolean $fetchSql 是否打印SQL语句
     * @return integer           返回总数量
     */
    public function getCount($where = null, $field = '*', $group = null, $fetchSql = false)
    {
        $count = Db::connect($this->connect)
            ->table($this->table)
            ->group($group)
            ->where($where)
            ->fetchSql($fetchSql)
            ->count($field);
        return $count;
    }

    /**
     * 获取数据列表
     * @author 贺强
     * @time   2019-07-25 13:12:19
     * @param  array   $where    条件
     * @param  boolean $field    要获取的字段
     * @param  string  $page     分页查询
     * @param  string  $order    排序
     * @param  string  $group    对结果集进行分组
     * @param  boolean $fetchSql 是否打印SQL
     */
    public function getList($where = null, $field = true, $page = null, $order = '', $group = null, $fetchSql = false)
    {
        $list = Db::connect($this->connect)
            ->table($this->table)
            ->field($field)
            ->order($order)
            ->page($page)
            ->group($group)
            ->where($where)
            ->fetchSql($fetchSql)
            ->select();
        return $list;
    }

    /**
     * 根据条件获取某一列的值
     * @author 贺强
     * @time   2019-07-30 20:40:11
     * @param  string  $field    要获取的字段名
     * @param  array   $where    条件
     * @param  integer $limit    查询多少条
     * @param  boolean $fetchSql 是否打印SQL语句
     * @return array             返回某字段值的数组
     */
    public function getField($field = '', $where = [], $limit = null, $fetchSql = false)
    {
        $column = Db::connect($this->connect)
            ->table($this->table)
            ->where($where)
            ->limit($limit)
            ->fetchSql($fetchSql)
            ->column($field);
        return $column;
    }

    /**
     * 根据条件获取某一列符合条件的第一条值
     * @author 贺强
     * @time   2019-07-25 17:34:01
     * @param  string  $field    列名
     * @param  array   $where    条件
     * @param  boolean $fetchSql 是否打印 SQL 语句
     */
    public function getFieldValue($field = '', $where = [], $fetchSql = false)
    {
        $value = Db::connect($this->connect)
            ->table($this->table)
            ->where($where)
            ->fetchSql($fetchSql)
            ->value($field);
        return $value;
    }

    /**
     * 执行原生 SQL 语句查询
     * @author 贺强
     * @time   2019-07-30 09:57:22
     * @param  string $sql SQL 语句
     */
    public function query($sql)
    {
        return Db::connect($this->connect)->query($sql);
    }

    /**
     * 执行原生 SQL 语句修改
     * @author 贺强
     * @time   2020-05-25 10:47:40
     * @param  string $sql SQL 语句
     */
    public function execute($sql)
    {
        return Db::connect($this->connect)->execute($sql);
    }
}
